Знаешь, как это сложно — нажать
на курок?
Знаменитый диктатор Ли Сий Сын
имеет в своём распоряжении армию из 105 человек. Он пронумеровал их от 0 до 105 – 1. Чем меньший
номер имеет человек, тем выше его командирские способности. Затем он
репрессировал n из них. Теперь диктатор собирается провести маленькую победоносную войну с
соседним государством. Поэтому ему нужно срочно выбрать самого талантливого
военного из оставшихся в живых.
Вход. В первой строке находится количество репрессированных n (1 ≤ n < 105). Вторая строка
содержит их номера в списке Ли Сий Сына — все числа меньше 105.
Выход. Выведите одно число
– номер самого талантливого из живых военных.
Пример
входа |
Пример
выхода |
8 3 0 1 7 2 4 6 17 |
5 |
сортировка
подсчетом
Анализ алгоритма
Пусть cnt – целочисленный
массив длины 105. Для каждого значения x из входного
списка репрессированных установим cnt[x] = 1.
Далее
следует найти наименьший индекс i, для
которого cnt[i] = 0. Число i – наименьшее, которое отсутствует во входном наборе
данных. Число i и будет номером самого
талантливого из живых военных.
Пример
Рассмотрим
состояние массива cnt после обработки всех данных входного теста.
Наименьшим
числом, которое отсутствует во входном массиве, будет 5, так как cnt[5] = 0. При этом 5 –
наименьший индекс, для которого соответствующая ячейка массива равна 0.
Реализация алгоритма
Объявим
массив для подсчета.
#define MAX 100001
int cnt[MAX];
Читаем входные данные. Для каждого значения x из входных
номеров репрессированных установим cnt[x] = 1.
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &x);
cnt[x] = 1;
}
Ищем
наименьшее неотрицательное целое число, которого нет во входном списке. Для
этого следует найти наименьшее i (i ≥ 0), для которого cnt[i] = 0.
for (i = 0; i < MAX; i++)
if (cnt[i] == 0)
{
printf("%d\n", i);
break;
}